"""
1717. 删除子字符串的最大得分
中等
相关标签
premium lock icon
相关企业
提示
给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面两种操作任意次。

删除子字符串 "ab" 并得到 x 分。
比方说，从 "cabxbae" 删除 ab ，得到 "cxbae" 。
删除子字符串"ba" 并得到 y 分。
比方说，从 "cabxbae" 删除 ba ，得到 "cabxe" 。
请返回对 s 字符串执行上面操作若干次能得到的最大得分。



示例 1：

输入：s = "cdbcbbaaabab", x = 4, y = 5
输出：19
解释：
- 删除 "cdbcbbaaabab" 中加粗的 "ba" ，得到 s = "cdbcbbaaab" ，加 5 分。
- 删除 "cdbcbbaaab" 中加粗的 "ab" ，得到 s = "cdbcbbaa" ，加 4 分。
- 删除 "cdbcbbaa" 中加粗的 "ba" ，得到 s = "cdbcba" ，加 5 分。
- 删除 "cdbcba" 中加粗的 "ba" ，得到 s = "cdbc" ，加 5 分。
总得分为 5 + 4 + 5 + 5 = 19 。
示例 2：

输入：s = "aabbaaxybbaabb", x = 5, y = 4
输出：20


提示：

1 <= s.length <= 105
1 <= x, y <= 104
s 只包含小写英文字母。
"""





class Solution:
    def maximumGain(self, s: str, x: int, y: int) -> int:
        """
        只要a，b在一块成对，无论怎么样的顺序都能组成ab/ba，不会有无法组成的情况
        问题点在于：如何取更大收益，比如x<y的情况，ba收益更高，对于ababab，如果取三个ab显然没有ba,ba,ab收益高
        那么就统计当前字符串：
        a在b前面的数量，他就是最终ab的最大数量，剩下取ba
        b在a前面的数量，他就是最终ba的最大数量，剩下取ab
        :param s:
        :param x:
        :param y:
        :return:
        """
        ans = 0
        aNum = 0 #a的数量
        bNum = 0 #b的数量
        aPre = 0 #a在b前面的数量
        bPre = 0 #b在a前面的数量
        for i in s:
            if i == 'a':
                aNum+=1
                if bPre<bNum:
                    bPre+=1
            elif i == 'b':
                bNum+=1
                if aPre<aNum:
                    aPre+=1
            else:
                ans += self.cal(x,y,aNum,aPre,bNum,bPre)
                aNum, bNum, aPre, bPre = 0, 0, 0, 0
        ans += self.cal(x,y,aNum,aPre,bNum,bPre)
        return ans

    def cal(self,x, y, aNum, aPre, bNum, bPre):
        """
        计算前面字符串的结果
        :param x: ab的分数
        :param y: ba的分数
        :param aNum: a的数量
        :param aPre: a在b前面的数量
        :param bNum: b的数量
        :param bPre: b在a前面的数量
        :return:
        """
        if aNum==0 or bNum==0:
            return 0
        #a,b成对的数量
        minNum = min(aNum,bNum)
        if x>y:
            return min(minNum,aPre) * x + max(minNum - aPre,0) * y
        else:
            return min(minNum,bPre) * y + max(minNum - bPre,0) * x
if __name__ == '__main__':
    s = Solution()
    print(s.maximumGain("cdbcbbaaabab",4,5)) #19
    print(s.maximumGain("aabbaaxybbaabb",5,4)) #20

